package cn.tedu.spring.day01;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 测试类
 */
public class Test01 {
    //1.创建Person类方式
    @Test
    public void test00(){
//    Person p=new Person();
//    p.say();p.eat();
    }
    //2.Spring--IOC控制反转“容器”---管理Person类
    @Test
    public void test02(){
        //①创建Spring容器，并且配置核心文件：applicationContext.xml(固定)
        ApplicationContext ac=
new ClassPathXmlApplicationContext("applicationContext.xml");
        //②获取bean对象---获取类(对象)
        //关于获取bean问题2：不可以配置多个id相同的bean（为什么？）
        Person p1=(Person)ac.getBean("person");
        System.out.println(p1);
        Person p2=(Person)ac.getBean("person1");
        System.out.println(p2);
        //③关闭容器
        ((ClassPathXmlApplicationContext)ac).close();
    }




    //有参数的构造器
    @Test
    public void test03(){
        ApplicationContext ac=
                new ClassPathXmlApplicationContext("applicationContext.xml");
        Person p=(Person)ac.getBean("person");
        System.out.println(p);
        ((ClassPathXmlApplicationContext)ac).close();
    }
    //工厂模式----第一种静态工厂
    @Test
    public void test04(){
        ApplicationContext ac=
                new ClassPathXmlApplicationContext("applicationContext.xml");
        NetConnection p=(NetConnection)ac.getBean("ncs");
        System.out.println(p);
        ((ClassPathXmlApplicationContext)ac).close();
    }
    //工厂模式----第二种实例工厂
    @Test
    public void test05(){
        ApplicationContext ac=
                new ClassPathXmlApplicationContext("applicationContext.xml");
        NetConnection p=(NetConnection)ac.getBean("nci");
        System.out.println(p);
        ((ClassPathXmlApplicationContext)ac).close();
    }
    //工厂模式----第三种Spring内置工厂：实现接口
    @Test
    public void test06(){
        ApplicationContext ac=
                new ClassPathXmlApplicationContext("applicationContext.xml");
        NetConnection p=(NetConnection)ac.getBean("ns");
        p.sendData();
        ((ClassPathXmlApplicationContext)ac).close();
    }

    //单例模式(默认)与多例模式（特殊）
    @Test
    public void test07(){
        ApplicationContext ac=
                new ClassPathXmlApplicationContext("applicationContext.xml");
        Person p1=(Person)ac.getBean("person");
        System.out.println(p1);
        Person p2=(Person)ac.getBean("person");
        System.out.println(p2);
        ((ClassPathXmlApplicationContext)ac).close();
    }
    //单例模式(默认):懒加载lazy--（单例模式）延后创建时机
    @Test
    public void test08(){
        ApplicationContext ac=
                new ClassPathXmlApplicationContext("applicationContext.xml");
         Tom t1=(Tom)ac.getBean("tom2");
         //懒加载特点：并不是改变为多例模式，而是延后了加载时机
        System.out.println(t1);
        Tom t2=(Tom)ac.getBean("tom2");
        System.out.println(t2);
        ((ClassPathXmlApplicationContext)ac).close();
    }

    //Spring  IOC ----初始化以及销毁----DAO
    @Test
    public void test09(){
        ApplicationContext ac=
                new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao ud=(UserDao)ac.getBean("ud");
        ud.addUser();    //错---操作数据---先链接库---释放
        ud.updateUser();  //错---操作数据---先链接库---释放
        ((ClassPathXmlApplicationContext)ac).close();
    }
}
